package com.proyecto.core.modelo.excepciones;

import java.util.Locale;
import java.util.ResourceBundle;
import java.util.StringTokenizer;

import com.proyecto.core.Utilidades.UtilString;
import com.proyecto.core.modelo.echo.constantes.ParametrosIniciales;

/**
 * La Clase <code>GeneralException</code> hereda de <code>Exception</code> 
 * y permite personalizar la execpcion generada, la cual se pasa en el constructor
 * por un una clave. 
 * Al capturar la excepcion en la vista, el programam lo buscara en el 
 * archivo properties respectivo y mostrara el mensaje asociado.
 *
 * @author  Elias Vargas
 * @version 0.9, 19/07/07
 * @see     java.lang.Exception
 * @since   JDK2.0
 * **/
public class GeneralException extends Exception {
	
	//static final long serialVersionUID = -1L;

	private String claveMensaje = null;
	private String foraneoMensaje = null;
	
	private Exception excepcion = null;
	
	private String rutaArchivoMensajes = ParametrosIniciales.RUTA_ARCHIVOS_PROPERTIES;

	public String getForaneoMensaje() {
		return foraneoMensaje;
	}

	public void setForaneoMensaje(String foraneoMensaje) {
		this.foraneoMensaje = foraneoMensaje;
	}

	public GeneralException(String claveMensaje) {
		super(claveMensaje);
		this.claveMensaje = claveMensaje;
	}
	public GeneralException(String claveMensaje, String foraneoMensaje) {
		super(claveMensaje);
		this.claveMensaje = claveMensaje;
		this.foraneoMensaje = foraneoMensaje;		
	}	

	public String getClaveMensaje() {
		return claveMensaje;
	}

	public void setClaveMensaje(String claveMensaje) {
		this.claveMensaje = claveMensaje;
	}
	
	public void addForaneoMensaje(String pValor){
		if (UtilString.esVacio(this.foraneoMensaje)){
			this.foraneoMensaje = "";
		}
		if (UtilString.esVacio(pValor)){
			pValor = "";
		}else{
			pValor = pValor + ";";
		}
		this.foraneoMensaje = this.foraneoMensaje + pValor;
	}
	
	public String getForaneoMensajeCompleto(ResourceBundle pMensajeError, ResourceBundle pResourceBundle){
		String textoCompleto = "";
		
		try{
			textoCompleto = pMensajeError.getString(this.getClaveMensaje());
		}catch (Exception e1){
			textoCompleto = this.getClaveMensaje();
		}
	
		StringTokenizer st = new  StringTokenizer(this.foraneoMensaje,";");
		while(st.hasMoreElements()){
			String item = st.nextToken();
			try{
				textoCompleto = textoCompleto + "- " + pResourceBundle.getString(item).replace(":", "") + "\n";
			}catch (Exception ep) {
				textoCompleto = textoCompleto + "- " + item + "\n";
			}
		}
		return textoCompleto;
	}
	
	public String obtenerMensajeCompleto(Locale local){
		String resultado = "NO HAY MENSAJE DEFINIDO";
		
		
		ResourceBundle errores= null;
		String clave = "";
		System.out.println("**************************************************getClaveMensaje-> " + getClaveMensaje());
		StringTokenizer claves = new StringTokenizer(getClaveMensaje(),".");
		if (claves.countTokens() > 1) {
			clave = (String) claves.nextElement();
			clave = (String) claves.nextElement();
			System.out.println("**clave-> " + clave);
			if(clave.equals("null")){
				clave = "persona";
			}
			System.out.println("clave**-> " + clave);
			if ("persona".equals(clave)){
				errores = ResourceBundle.getBundle(rutaArchivoMensajes+"Mensajes", local);	
			}else if ("afiliacion".equals(clave) ){
			    errores = ResourceBundle.getBundle(rutaArchivoMensajes+"MensajesAfiliacion", local);
			}else if ("HistoriasClinicas".equals(clave) ){
			    errores = ResourceBundle.getBundle(rutaArchivoMensajes+"MensajesHistoriasClinicas", local);
			}else if ("contratos".equals(clave) ){
			    errores = ResourceBundle.getBundle(rutaArchivoMensajes+"MensajesContratos", local);
			}else if ("Facturacion".equals(clave) ){
			    errores = ResourceBundle.getBundle(rutaArchivoMensajes+"MensajesFacturacion", local);			    
			}else{
				/**
				 * Modificacion hecha por KLITOS.. Bajo apache nativo, cuando el segundon token del propertie viene en minuscula
				 * y se realiza la concatenacion, tomcat no consigue el archivo puesto su nombre por estandart debe venir en mayuscula.
				 * La solucion es terminar de estandarizar los key colocando el segundo token en mayuscula. Mientras la solucion
				 * mas elegante que consegui, fue forzarlo con la siguiente linea de codigo, a que sea mayuscula..
				 */
				clave = clave.substring(0, 1).toUpperCase()+clave.substring(1);
				/**
				 * Fin de modificacion de Klitos..... 07/04/2008 9:02Am. 
				 */
				errores = ResourceBundle.getBundle(rutaArchivoMensajes +"Mensajes"+ clave,local);
			}
		}	
			
		try {
			resultado = errores.getString(getClaveMensaje());
			if (getForaneoMensaje() != null) {
				
				ResourceBundle etiquetas= null;
				 if ("afiliado".equals(clave) || "pensiones".equals(clave)){
						etiquetas = 
							ResourceBundle.getBundle(
							rutaArchivoMensajes+"EtiquetasPensiones-Afiliados",
							local);		 
				 }else{
					 	clave = clave.substring(0, 1).toUpperCase()+clave.substring(1);
						etiquetas = 
							ResourceBundle.getBundle(
									rutaArchivoMensajes+"Etiquetas" + clave,
							local);					 
				 }
				resultado = getForaneoMensajeCompleto(errores, etiquetas);
			}
		} catch (Exception excep) {

		}
	return 	resultado;
	}

	public Exception getExcepcion() {
		return excepcion;
	}

	public void setExcepcion(Exception excepcion) {
		this.excepcion = excepcion;
	}

	
}
